<?
// MIDI Duration constants
define('MIDI_WHOLE',2880);
define('MIDI_HALF_DOTTED',2160);
define('MIDI_HALF',1440);
define('MIDI_QUARTER_DOTTED',1080);
define('MIDI_QUARTER',720);
define('MIDI_8TH_DOTTED',540);
define('MIDI_8TH',360);
define('MIDI_16TH_DOTTED',270);
define('MIDI_16TH',180);
define('MIDI_32ND_DOTTED',120);
define('MIDI_32ND',90);
define('MIDI_64TH',45);
define('MIDI_PPQN',MIDI_QUARTER); // MIDI PPQN,amount of "MIDI time" per quarter note

// MIDI Channel constants
define('NUM_MIDI_CHANNELS_PER_PORT',16); ///< Number of MIDI channels per port
define('FIRST_MIDI_CHANNEL',0); ///< First MIDI channel
define('LAST_MIDI_CHANNEL',15); ///< Last MIDI channel

define('MIN_MIDI_CHANNEL_VOLUME',0); ///< Minimum volume level for a MIDI channel
define('MAX_MIDI_CHANNEL_VOLUME',0x0000007f); ///< Maximum volume level for a MIDI channel

define('MIN_MIDI_CHANNEL_EFFECT_LEVEL',0); ///< Miniumum level for channel effects (chorus, reverb, etc.)
define('MAX_MIDI_CHANNEL_EFFECT_LEVEL',0x0000007f); ///< Maximum level for channel effects (chorus, reverb, etc.)

// MIDI Note constants
define('NUM_MIDI_NOTES',128); ///< Number of allowable notes
define('MIN_MIDI_NOTE',0); ///< Lowest note,C-1
define('MAX_MIDI_NOTE',127); ///< Highest note,G9

define('MIDI_NOTE_KEY_C',0);
define('MIDI_NOTE_KEY_CSHARP',1);
define('MIDI_NOTE_KEY_DFLAT',1);
define('MIDI_NOTE_KEY_D',2);
define('MIDI_NOTE_KEY_DSHARP',3);
define('MIDI_NOTE_KEY_EFLAT',3);
define('MIDI_NOTE_KEY_E',4);
define('MIDI_NOTE_KEY_F',5);
define('MIDI_NOTE_KEY_FSHARP',6);
define('MIDI_NOTE_KEY_GFLAT',6);
define('MIDI_NOTE_KEY_G',7);
define('MIDI_NOTE_KEY_GSHARP',8);
define('MIDI_NOTE_KEY_AFLAT',8);
define('MIDI_NOTE_KEY_A',9);
define('MIDI_NOTE_KEY_ASHARP',10);
define('MIDI_NOTE_KEY_BFLAT',10);
define('MIDI_NOTE_KEY_B',11);
define('MIN_MIDI_NOTE_KEY',MIDI_NOTE_KEY_C);
define('MAX_MIDI_NOTE_KEY',MIDI_NOTE_KEY_B);

define('MIDI_NOTE_CN1',0);
define('MIDI_NOTE_CSHARPN1',1);
define('MIDI_NOTE_DFLATN1',1);
define('MIDI_NOTE_DN1',2);
define('MIDI_NOTE_DSHARPN1',3);
define('MIDI_NOTE_EFLATN1',3);
define('MIDI_NOTE_EN1',4);
define('MIDI_NOTE_FN1',5);
define('MIDI_NOTE_FSHARPN1',6);
define('MIDI_NOTE_GFLATN1',6);
define('MIDI_NOTE_GN1',7);
define('MIDI_NOTE_GSHARPN1',8);
define('MIDI_NOTE_AFLATN1',8);
define('MIDI_NOTE_AN1',9);
define('MIDI_NOTE_ASHARPN1',10);
define('MIDI_NOTE_BFLATN1',10);
define('MIDI_NOTE_BN1',11);
define('MIDI_NOTE_C0',12);
define('MIDI_NOTE_CSHARP0',13);
define('MIDI_NOTE_DFLAT0',13);
define('MIDI_NOTE_D0',14);
define('MIDI_NOTE_DSHARP0',15);
define('MIDI_NOTE_EFLAT0',15);
define('MIDI_NOTE_E0',16);
define('MIDI_NOTE_F0',17);
define('MIDI_NOTE_FSHARP0',18);
define('MIDI_NOTE_GFLAT0',18);
define('MIDI_NOTE_G0',19);
define('MIDI_NOTE_GSHARP0',20);
define('MIDI_NOTE_AFLAT0',20);
define('MIDI_NOTE_A0',21);
define('MIDI_NOTE_ASHARP0',22);
define('MIDI_NOTE_BFLAT0',22);
define('MIDI_NOTE_B0',23);
define('MIDI_NOTE_C1',24);
define('MIDI_NOTE_CSHARP1',25);
define('MIDI_NOTE_DFLAT1',25);
define('MIDI_NOTE_D1',26);
define('MIDI_NOTE_DSHARP1',27);
define('MIDI_NOTE_EFLAT1',27);
define('MIDI_NOTE_E1',28);
define('MIDI_NOTE_F1',29);
define('MIDI_NOTE_FSHARP1',30);
define('MIDI_NOTE_GFLAT1',30);
define('MIDI_NOTE_G1',31);
define('MIDI_NOTE_GSHARP1',32);
define('MIDI_NOTE_AFLAT1',32);
define('MIDI_NOTE_A1',33);
define('MIDI_NOTE_ASHARP1',34);
define('MIDI_NOTE_BFLAT1',34);
define('MIDI_NOTE_B1',35);
define('MIDI_NOTE_C2',36);
define('MIDI_NOTE_CSHARP2',37);
define('MIDI_NOTE_DFLAT2',37);
define('MIDI_NOTE_D2',38);
define('MIDI_NOTE_DSHARP2',39);
define('MIDI_NOTE_EFLAT2',39);
define('MIDI_NOTE_E2',40);
define('MIDI_NOTE_F2',41);
define('MIDI_NOTE_FSHARP2',42);
define('MIDI_NOTE_GFLAT2',42);
define('MIDI_NOTE_G2',43);
define('MIDI_NOTE_GSHARP2',44);
define('MIDI_NOTE_AFLAT2',44);
define('MIDI_NOTE_A2',45);
define('MIDI_NOTE_ASHARP2',46);
define('MIDI_NOTE_BFLAT2',46);
define('MIDI_NOTE_B2',47);
define('MIDI_NOTE_C3',48);
define('MIDI_NOTE_CSHARP3',49);
define('MIDI_NOTE_DFLAT3',49);
define('MIDI_NOTE_D3',50);
define('MIDI_NOTE_DSHARP3',51);
define('MIDI_NOTE_EFLAT3',51);
define('MIDI_NOTE_E3',52);
define('MIDI_NOTE_F3',53);
define('MIDI_NOTE_FSHARP3',54);
define('MIDI_NOTE_GFLAT3',54);
define('MIDI_NOTE_G3',55);
define('MIDI_NOTE_GSHARP3',56);
define('MIDI_NOTE_AFLAT3',56);
define('MIDI_NOTE_A3',57);
define('MIDI_NOTE_ASHARP3',58);
define('MIDI_NOTE_BFLAT3',58);
define('MIDI_NOTE_B3',59);
define('MIDI_NOTE_C4',60);
define('MIDI_NOTE_MIDDLE_C',MIDI_NOTE_C4);
define('MIDI_NOTE_CSHARP4',61);
define('MIDI_NOTE_DFLAT4',61);
define('MIDI_NOTE_D4',62);
define('MIDI_NOTE_DSHARP4',63);
define('MIDI_NOTE_EFLAT4',63);
define('MIDI_NOTE_E4',64);
define('MIDI_NOTE_F4',65);
define('MIDI_NOTE_FSHARP4',66);
define('MIDI_NOTE_GFLAT4',66);
define('MIDI_NOTE_G4',67);
define('MIDI_NOTE_GSHARP4',68);
define('MIDI_NOTE_AFLAT4',68);
define('MIDI_NOTE_A4',69);
define('MIDI_NOTE_ASHARP4',70);
define('MIDI_NOTE_BFLAT4',70);
define('MIDI_NOTE_B4',71);
define('MIDI_NOTE_C5',72);
define('MIDI_NOTE_CSHARP5',73);
define('MIDI_NOTE_DFLAT5',73);
define('MIDI_NOTE_D5',74);
define('MIDI_NOTE_DSHARP5',75);
define('MIDI_NOTE_EFLAT5',75);
define('MIDI_NOTE_E5',76);
define('MIDI_NOTE_F5',77);
define('MIDI_NOTE_FSHARP5',78);
define('MIDI_NOTE_GFLAT5',78);
define('MIDI_NOTE_G5',79);
define('MIDI_NOTE_GSHARP5',80);
define('MIDI_NOTE_AFLAT5',80);
define('MIDI_NOTE_A5',81);
define('MIDI_NOTE_ASHARP5',82);
define('MIDI_NOTE_BFLAT5',82);
define('MIDI_NOTE_B5',83);
define('MIDI_NOTE_C6',84);
define('MIDI_NOTE_CSHARP6',85);
define('MIDI_NOTE_DFLAT6',85);
define('MIDI_NOTE_D6',86);
define('MIDI_NOTE_DSHARP6',87);
define('MIDI_NOTE_EFLAT6',87);
define('MIDI_NOTE_E6',88);
define('MIDI_NOTE_F6',89);
define('MIDI_NOTE_FSHARP6',90);
define('MIDI_NOTE_GFLAT6',90);
define('MIDI_NOTE_G6',91);
define('MIDI_NOTE_GSHARP6',92);
define('MIDI_NOTE_AFLAT6',92);
define('MIDI_NOTE_A6',93);
define('MIDI_NOTE_ASHARP6',94);
define('MIDI_NOTE_BFLAT6',94);
define('MIDI_NOTE_B6',95);
define('MIDI_NOTE_C7',96);
define('MIDI_NOTE_CSHARP7',97);
define('MIDI_NOTE_DFLAT7',97);
define('MIDI_NOTE_D7',98);
define('MIDI_NOTE_DSHARP7',99);
define('MIDI_NOTE_EFLAT7',99);
define('MIDI_NOTE_E7',100);
define('MIDI_NOTE_F7',101);
define('MIDI_NOTE_FSHARP7',102);
define('MIDI_NOTE_GFLAT7',102);
define('MIDI_NOTE_G7',103);
define('MIDI_NOTE_GSHARP7',104);
define('MIDI_NOTE_AFLAT7',104);
define('MIDI_NOTE_A7',105);
define('MIDI_NOTE_ASHARP7',106);
define('MIDI_NOTE_BFLAT7',106);
define('MIDI_NOTE_B7',107);
define('MIDI_NOTE_C8',108);
define('MIDI_NOTE_CSHARP8',109);
define('MIDI_NOTE_DFLAT8',109);
define('MIDI_NOTE_D8',110);
define('MIDI_NOTE_DSHARP8',111);
define('MIDI_NOTE_EFLAT8',111);
define('MIDI_NOTE_E8',112);
define('MIDI_NOTE_F8',113);
define('MIDI_NOTE_FSHARP8',114);
define('MIDI_NOTE_GFLAT8',114);
define('MIDI_NOTE_G8',115);
define('MIDI_NOTE_GSHARP8',116);
define('MIDI_NOTE_AFLAT8',116);
define('MIDI_NOTE_A8',117);
define('MIDI_NOTE_ASHARP8',118);
define('MIDI_NOTE_BFLAT8',118);
define('MIDI_NOTE_B8',119);
define('MIDI_NOTE_C9',120);
define('MIDI_NOTE_CSHARP9',121);
define('MIDI_NOTE_DFLAT9',121);
define('MIDI_NOTE_D9',122);
define('MIDI_NOTE_DSHARP9',123);
define('MIDI_NOTE_EFLAT9',123);
define('MIDI_NOTE_E9',124);
define('MIDI_NOTE_F9',125);
define('MIDI_NOTE_FSHARP9',126);
define('MIDI_NOTE_GFLAT9',126);
define('MIDI_NOTE_G9',127);

define('MIN_MIDI_NOTE_VOLUME',0); ///< Minimum volume level for a MIDI note
define('MAX_MIDI_NOTE_VOLUME',0x0000007f); ///< Maximum volume level for a MIDI note

// MIDI Preset constants
define('NUM_MIDI_PRESETS',128);
define('MIDI_PRESET_ACOUSTIC_GRAND',0);
define('MIDI_PRESET_BRIGHT_ACOUSTIC',1);
define('MIDI_PRESET_ELECTRIC_GRAND',2);
define('MIDI_PRESET_HONKY_TONK',3);
define('MIDI_PRESET_ELECTRIC_PIANO1',4);
define('MIDI_PRESET_ELECTRIC_PIANO2',5);
define('MIDI_PRESET_HARPSICHORD',6);
define('MIDI_PRESET_CLAV',7);
define('MIDI_PRESET_CELESTA',8);
define('MIDI_PRESET_GLOCKENSPIEL',9);
define('MIDI_PRESET_MUSIC_BOX',10);
define('MIDI_PRESET_VIBRAPHONE',11);
define('MIDI_PRESET_MARIMBA',12);
define('MIDI_PRESET_XYLOPHONE',13);
define('MIDI_PRESET_TUBULAR_BELLS',14);
define('MIDI_PRESET_DULCIMER',15);
define('MIDI_PRESET_DRAWBAR_ORGAN',16);
define('MIDI_PRESET_PERCUSSIVE_ORGAN',17);
define('MIDI_PRESET_ROCK_ORGAN',18);
define('MIDI_PRESET_CHURCH_ORGAN',19);
define('MIDI_PRESET_REED_ORGAN',20);
define('MIDI_PRESET_ACCORDIAN',21);
define('MIDI_PRESET_HARMONICA',22);
define('MIDI_PRESET_TANGO_ACCORDIAN',23);
define('MIDI_PRESET_ACOUSTIC_GUITAR_NYLON',24);
define('MIDI_PRESET_ACOUSTIC_GUITAR_STEEL',25);
define('MIDI_PRESET_ELECTRIC_GUITAR_JAZZ',26);
define('MIDI_PRESET_ELECTRIC_GUITAR_CLEAN',27);
define('MIDI_PRESET_ELECTRIC_GUITAR_MUTED',28);
define('MIDI_PRESET_OVERDRIVEN_GUITAR',29);
define('MIDI_PRESET_DISTORTION_GUITAR',30);
define('MIDI_PRESET_GUITAR_HARMONICS',31);
define('MIDI_PRESET_ACOUSTIC_BASS',32);
define('MIDI_PRESET_ELECTRIC_BASS_FINGER',33);
define('MIDI_PRESET_ELECTRIC_BASS_PICK',34);
define('MIDI_PRESET_FRETLESS_BASS',35);
define('MIDI_PRESET_SLAP_BASS1',36);
define('MIDI_PRESET_SLAP_BASS2',37);
define('MIDI_PRESET_SYNTH_BASS1',38);
define('MIDI_PRESET_SYNTH_BASS2',39);
define('MIDI_PRESET_VIOLIN',40);
define('MIDI_PRESET_VIOLA',41);
define('MIDI_PRESET_CELLO',42);
define('MIDI_PRESET_CONTRABASS',43);
define('MIDI_PRESET_TREMOLO_STRINGS',44);
define('MIDI_PRESET_PIZZICATO_STRINGS',45);
define('MIDI_PRESET_ORCHESTRAL_STRINGS',46);
define('MIDI_PRESET_TIMPANI',47);
define('MIDI_PRESET_STRING_ENSEMBLE1',48);
define('MIDI_PRESET_STRING_ENSEMBLE2',49);
define('MIDI_PRESET_SYNTHSTRINGS1',50);
define('MIDI_PRESET_SYNTHSTRINGS2',51);
define('MIDI_PRESET_CHOIR_AAHS',52);
define('MIDI_PRESET_VOICE_OOHS',53);
define('MIDI_PRESET_SYNTH_VOICE',54);
define('MIDI_PRESET_ORCHESTRA_HIT',55);
define('MIDI_PRESET_TRUMPET',56);
define('MIDI_PRESET_TROMBONE',57);
define('MIDI_PRESET_TUBA',58);
define('MIDI_PRESET_MUTED_TRUMPET',59);
define('MIDI_PRESET_FRENCH_HORN',60);
define('MIDI_PRESET_BRASS_SECTION',61);
define('MIDI_PRESET_SYNTHBRASS1',62);
define('MIDI_PRESET_SYNTHBRASS2',63);
define('MIDI_PRESET_SOPRANO_SAX',64);
define('MIDI_PRESET_ALTO_SAX',65);
define('MIDI_PRESET_TENOR_SAX',66);
define('MIDI_PRESET_BARITONE_SAX',67);
define('MIDI_PRESET_OBOE',68);
define('MIDI_PRESET_ENGLISH_HORN',69);
define('MIDI_PRESET_BASSOON',70);
define('MIDI_PRESET_CLARINET',71);
define('MIDI_PRESET_PICCOLO',72);
define('MIDI_PRESET_FLUTE',73);
define('MIDI_PRESET_RECORDER',74);
define('MIDI_PRESET_PAN_FLUTE',75);
define('MIDI_PRESET_BLOWN_BOTTLE',76);
define('MIDI_PRESET_SKAKUHACHI',77);
define('MIDI_PRESET_WHISTLE',78);
define('MIDI_PRESET_OCARINA',79);
define('MIDI_PRESET_LEAD1_SQUARE',80);
define('MIDI_PRESET_LEAD2_SAWTOOTH',81);
define('MIDI_PRESET_LEAD3_CALLIOPE',82);
define('MIDI_PRESET_LEAD4_CHIFF',83);
define('MIDI_PRESET_LEAD5_CHARANG',84);
define('MIDI_PRESET_LEAD6_VOICE',85);
define('MIDI_PRESET_LEAD7_FIFTHS',86);
define('MIDI_PRESET_LEAD8_BASSLEAD',87);
define('MIDI_PRESET_PAD1_NEWAGE',88);
define('MIDI_PRESET_PAD2_WARM',89);
define('MIDI_PRESET_PAD3_POLYSYNTH',90);
define('MIDI_PRESET_PAD4_CHOIR',91);
define('MIDI_PRESET_PAD5_BOWED',92);
define('MIDI_PRESET_PAD6_METALLIC',93);
define('MIDI_PRESET_PAD7_HALO',94);
define('MIDI_PRESET_PAD8_SWEEP',95);
define('MIDI_PRESET_FX1_RAIN',96);
define('MIDI_PRESET_FX2_SOUNDTRACK',97);
define('MIDI_PRESET_FX3_CRYSTAL',98);
define('MIDI_PRESET_FX4_ATMOSPHERE',99);
define('MIDI_PRESET_FX5_BRIGHTNESS',100);
define('MIDI_PRESET_FX6_GOBLINS',101);
define('MIDI_PRESET_FX7_ECHOES',102);
define('MIDI_PRESET_FX8_SCIFI',103);
define('MIDI_PRESET_SITAR',104);
define('MIDI_PRESET_BANJO',105);
define('MIDI_PRESET_SHAMISEN',106);
define('MIDI_PRESET_KOTO',107);
define('MIDI_PRESET_KALIMBA',108);
define('MIDI_PRESET_BAGPIPE',109);
define('MIDI_PRESET_FIDDLE',110);
define('MIDI_PRESET_SHANAI',111);
define('MIDI_PRESET_TINKLE_BELL',112);
define('MIDI_PRESET_AGOGO',113);
define('MIDI_PRESET_STEEL_DRUMS',114);
define('MIDI_PRESET_WOODBLOCK',115);
define('MIDI_PRESET_TAIKO_DRUM',116);
define('MIDI_PRESET_MELODIC_TOM',117);
define('MIDI_PRESET_SYNTH_DRUM',118);
define('MIDI_PRESET_REVERSE_CYMBAL',119);
define('MIDI_PRESET_GUITAR_FRET_NOISE',120);
define('MIDI_PRESET_BREATH_NOISE',121);
define('MIDI_PRESET_SEASHORE',122);
define('MIDI_PRESET_BIRD_TWEET',123);
define('MIDI_PRESET_TELEPHONE_RING',124);
define('MIDI_PRESET_HELICOPTER',125);
define('MIDI_PRESET_APPLAUSE',126);
define('MIDI_PRESET_GUNSHOT',127);
define('FIRST_MIDI_PRESET',MIDI_PRESET_ACOUSTIC_GRAND);
define('LAST_MIDI_PRESET',MIDI_PRESET_GUNSHOT);

// Percussion Sounds constants
define('NUM_MIDI_PERCUSSION_PRESETS',47);
define('MIDI_PERCUSSION_PRESET_ACOUSTIC_BASS_DRUM',0);
define('MIDI_PERCUSSION_PRESET_BASS_DRUM1',1);
define('MIDI_PERCUSSION_PRESET_SIDE_STICK',2);
define('MIDI_PERCUSSION_PRESET_ACOUSTIC_SNARE',3);
define('MIDI_PERCUSSION_PRESET_HAND_CLAP',4);
define('MIDI_PERCUSSION_PRESET_ELECTRIC_SNARE',5);
define('MIDI_PERCUSSION_PRESET_LOW_FLOOR_TOM',6);
define('MIDI_PERCUSSION_PRESET_CLOSED_HI_HAT',7);
define('MIDI_PERCUSSION_PRESET_HIGH_FLOOR_TOM',8);
define('MIDI_PERCUSSION_PRESET_PEDAL_HI_HAT',9);
define('MIDI_PERCUSSION_PRESET_LOW_TOM',10);
define('MIDI_PERCUSSION_PRESET_OPEN_HI_HAT',11);
define('MIDI_PERCUSSION_PRESET_LOW_MID_TOM',12);
define('MIDI_PERCUSSION_PRESET_HI_MID_TOM',13);
define('MIDI_PERCUSSION_PRESET_CRASH_CYMBAL1',14);
define('MIDI_PERCUSSION_PRESET_HIGH_TOM',15);
define('MIDI_PERCUSSION_PRESET_RIDE_CYMBAL1',16);
define('MIDI_PERCUSSION_PRESET_CHINESE_CYMBAL',17);
define('MIDI_PERCUSSION_PRESET_RIDE_BELL',18);
define('MIDI_PERCUSSION_PRESET_TAMBOURINE',19);
define('MIDI_PERCUSSION_PRESET_SPLASH_CYMBAL',20);
define('MIDI_PERCUSSION_PRESET_COWBELL',21);
define('MIDI_PERCUSSION_PRESET_CRASH_CYMBAL2',22);
define('MIDI_PERCUSSION_PRESET_VIBRASLAP',23);
define('MIDI_PERCUSSION_PRESET_RIDE_CYMBAL2',24);
define('MIDI_PERCUSSION_PRESET_HI_BONGO',25);
define('MIDI_PERCUSSION_PRESET_LOW_BONGO',26);
define('MIDI_PERCUSSION_PRESET_MUTE_HI_CONGA',27);
define('MIDI_PERCUSSION_PRESET_OPEN_HI_CONGA',28);
define('MIDI_PERCUSSION_PRESET_LOW_CONGA',29);
define('MIDI_PERCUSSION_PRESET_HIGH_TIMBALE',30);
define('MIDI_PERCUSSION_PRESET_LOW_TIMBALE',31);
define('MIDI_PERCUSSION_PRESET_HIGH_AGOGO',32);
define('MIDI_PERCUSSION_PRESET_LOW_AGOGO',33);
define('MIDI_PERCUSSION_PRESET_CABASA',34);
define('MIDI_PERCUSSION_PRESET_MARACAS',35);
define('MIDI_PERCUSSION_PRESET_SHORT_WHISTLE',36);
define('MIDI_PERCUSSION_PRESET_LONG_WHISTLE',37);
define('MIDI_PERCUSSION_PRESET_SHORT_GUIRO',38);
define('MIDI_PERCUSSION_PRESET_LONG_GUIRO',39);
define('MIDI_PERCUSSION_PRESET_CLAVES',40);
define('MIDI_PERCUSSION_PRESET_HI_WOOD_BLOCK',41);
define('MIDI_PERCUSSION_PRESET_LOW_WOOD_BLOCK',42);
define('MIDI_PERCUSSION_PRESET_MUTE_CUICA',43);
define('MIDI_PERCUSSION_PRESET_OPEN_CUICA',44);
define('MIDI_PERCUSSION_PRESET_MUTE_TRIANGLE',45);
define('MIDI_PERCUSSION_PRESET_OPEN_TRIANGLE',46);
define('FIRST_MIDI_PERCUSSION_PRESET',MIDI_PERCUSSION_PRESET_ACOUSTIC_BASS_DRUM);
define('LAST_MIDI_PERCUSSION_PRESET',MIDI_PERCUSSION_PRESET_OPEN_TRIANGLE);




// MIDI Channel Functions
/// Determines if a MIDI channel is valid
/// @param MIDI channel to validate
/// @return True if the MIDI channel is valid, false if not
function wxIsValidMidiChannel($channel)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($channel <= LAST_MIDI_CHANNEL);
}

function wxIsValidMidiChannelVolume($volume)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($volume <= MAX_MIDI_CHANNEL_VOLUME);
}

/// Determines if a MIDI channel effect level is valid
/// @param level MIDI channel effect level to validate
/// @return True if the MIDI channel effect level is valid, false if not
function wxIsValidMidiChannelEffectLevel($level)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($level <= MAX_MIDI_CHANNEL_EFFECT_LEVEL);
}

// MIDI Note Functions
/// Determines if a MIDI note value is valid
/// @param note MIDI note to validate
/// @return True if the MIDI note value is valid, false if not
function wxIsValidMidiNote($note)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($note <= MAX_MIDI_NOTE);
}

/// Gets the text representation of a MIDI note
/// @param note MIDI note to get the text representation for
/// @param sharps True to get the sharp representation of the note, false to get the flat representation of the note
/// @return A text representation of the MIDI note
function wxGetMidiNoteText($note, $sharps)
{
    //------Last Checked------//
    // - Dec 14, 2004
    if(!wxIsValidMidiNote($note)) return "";
    $pitch = wxGetMidiNotePitch($note);

    $notes = array();

    if ($sharps)
    {
        $notes[0] = "C";
        $notes[1] = "C#";
        $notes[2] = "D";
        $notes[3] = "D#";
        $notes[4] = "E";
        $notes[5] = "F";
        $notes[6] = "F#";
        $notes[7] = "G";
        $notes[8] = "G#";
        $notes[9] = "A";
        $notes[10] = "A#";
        $notes[11] = "B";
    }
	else
	{
	    $notes[0] = "C";
        $notes[1] = "Db";
        $notes[2] = "D";
        $notes[3] = "Eb";
        $notes[4] = "E";
        $notes[5] = "F";
        $notes[6] = "Gb";
        $notes[7] = "G";
        $notes[8] = "Ab";
        $notes[9] = "A";
        $notes[10] = "Bb";
        $notes[11] = "B";
    }

    return ($notes[$pitch]);
}

/// Offsets a MIDI note by an offset
/// @param note MIDI note to offset
/// @param offset Amount to offset the note
/// @return The offset note
function wxOffsetMidiNote($note, $offset)
{
    //------Last Checked------//
    // - Dec 14, 2004
    $temp = $note + $offset;

    if ($temp < MIN_MIDI_NOTE)
        $temp = MIN_MIDI_NOTE;
    else if ($temp > MAX_MIDI_NOTE)
        $temp = MAX_MIDI_NOTE;

    return $temp;
}

/// Determines if a MIDI note key is valid
/// @param key MIDI note key to validate
/// @return True if the MIDI note key is valid, false if not
function wxIsValidMidiNoteKey($key)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($key <= MAX_MIDI_NOTE_KEY);
}

/// Gets the pitch value for a MIDI note
/// @param note MIDI note to get the pitch value for
/// @return The pitch value for the MIDI note
function wxGetMidiNotePitch($note)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($note % 12);
}

/// Gets the octave value for a MIDI note
/// @param note MIDI note to get the octave value for
/// @return The octave value for the MIDI note
function wxGetMidiNoteOctave($note)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return (($note / 12) - 1);
}

/// Determines if a MIDI note volume is valid
/// @param volume MIDI note volume to validate
/// @return True if the MIDI note volume is valid, false if not
function wxIsValidMidiNoteVolume($volume)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($volume <= MAX_MIDI_NOTE_VOLUME);
}

// MIDI Preset Functions
/// Determines if a MIDI preset is valid
/// @param preset MIDI preset to validate
/// @return True if the MIDI preset is valid, false if not
function wxIsValidMidiPreset($preset)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($preset <= LAST_MIDI_PRESET);
}

// MIDI Percussion Preset Functions
/// Determines if a MIDI percussion preset is valid
/// @param preset MIDI percussion preset to validate
/// @return True if the MIDI percussion preset is valid, false if not
function wxIsValidMidiPercussionPreset($preset)
{
    //------Last Checked------//
    // - Dec 9, 2004
    return ($preset <= LAST_MIDI_PERCUSSION_PRESET);
}



?>